package com.ruoyi.common.core.utils;

import lombok.Data;

import java.io.Serializable;
import java.util.List;

@Data
public class PageInfoUtil<T> implements Serializable {

    /**
     * 当前页
     */
    private int pageNum;

    /**
     * 页大小
     */
    private int pageSize;

    /**
     * 总页数
     */
    private int pages;

    /**
     * 总记录数
     */
    private int total;

    /**
     * 当前页拥有的条数
     */
    private int currentPageNums;

    /**
     * 数据库开始索引
     */
    private int beginIndex;

    /**
     * 数据库结束索引
     */
    private int endIndex;

    /**
     * 分页后的数据集合
     */
    private List<T> list;

    /**
     * 是否有上一页
     */
    private boolean haveLastPage;

    /**
     * 是否有下一页
     */
    private boolean haveNextPage;

    /**
     * 当前页的上一页页号
     */
    private int lastPageNum;

    /**
     * 当前页的下一页页号
     */
    private int nextPageNum;


    public PageInfoUtil(List<T> list) {
        this.list = list;
    }

    public PageInfoUtil() {

    }

    public void startPage(int pageNum, int pageSize) {

        if (list != null) {
            //当前页
            this.pageNum = pageNum > 0 ? pageNum : 1;
            //页大小
            this.pageSize = pageSize > 0 ? pageSize : 10;
            //已知页大小,总记录数,求总页数
            total = list.size();

            if (total > 0) {
                //总页数
                pages = (int) Math.ceil(((double) total / pageSize));
                //数据开始索引
                int fromIndex = (pageNum - 1) * pageSize;
                beginIndex = fromIndex;
                //数据结束索引
                int endIndex = fromIndex + pageSize - 1;
                this.endIndex = endIndex;

                if (pageNum > pages) {
                    haveLastPage = false;
                    haveNextPage = false;
                } else if (pageNum > 0 && pageNum <= pages) {
                    //上一页
                    lastPageNum = this.pageNum - 1 <= 0 ? 1 : this.pageNum - 1;
                    //下一页
                    nextPageNum = Math.min(pageNum + 1, pages);
                    haveLastPage = pageNum - 1 > 0;
                    haveNextPage = endIndex + 1 < total;
                } else {
                    haveLastPage = false;
                    haveNextPage = false;
                }

                //当前页拥有的数据条数（1.当前页拥有页大小条数小于等于当前页结尾+1<=总记录数2.当前页拥有页大小） 总数据条数-当前页
                if (fromIndex + 1 <= total) {
                    if (endIndex >= total) {
                        setList(list.subList(fromIndex, total));
                    } else {
                        setList(list.subList(fromIndex, endIndex + 1));
                    }
                    if (endIndex + 1 <= total) {
                        currentPageNums = pageSize;
                    } else if (endIndex + 1 > total) {
                        currentPageNums = total - fromIndex;
                    }
                }

            }

        }
        
    }


}
